package main

/*
给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。

请你将两个数相加，并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外，这两个数都不会以 0 开头

*/
func main() {
	l1 := ListNode{2, &ListNode{4, &ListNode{3, nil}}}
	l2 := ListNode{5, &ListNode{6, &ListNode{4, nil}}}
	l3 := addTwoNumbers(&l1, &l2)
	for l3 != nil {
		print(l3.Val, " ")
		l3 = l3.Next
	}
}

//
//  ListNode
//  @Description: 链表的每个节点
//
type ListNode struct {
	Val  int
	Next *ListNode
}

/**
 *	addTwoNumbers
 *	@Description:
 *	@param l1 *ListNode
 *	@param l2 *ListNode
 *	@return *ListNode
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	l3 := ListNode{0, nil}

	for tmp := &l3; l2 != nil || l1 != nil; {
		var val = 0
		if l2 == nil && l1 != nil {
			val = l1.Val + tmp.Val
		} else if l1 == nil && l2 != nil {
			val = l2.Val + tmp.Val
		} else {
			val = l1.Val + l2.Val + tmp.Val
		}
		if val >= 10 {
			tmp.Val = val % 10
			tmp.Next = &ListNode{1, nil}
		} else {
			tmp.Val = val
			tmp.Next = &ListNode{0, nil}
		}
		if l1 == nil {
			l1 = nil
		} else {
			l1 = l1.Next
		}
		if l2 == nil {
			l2 = nil
		} else {
			l2 = l2.Next
		}
		if l1 == nil && l2 == nil && tmp.Next.Val == 0 {
			tmp.Next = nil
		}
		tmp = tmp.Next
	}
	return &l3
}
